package status

import (
	"io/ioutil"
	"path/filepath"
	"sync"
	"sync/atomic"
)

func GetDirUse(dir string) (total int64) {
	var wait sync.WaitGroup
	var scanDir func(dir string)
	scanDir = func(dir string) {
		defer wait.Done()
		dirAry, err := ioutil.ReadDir(dir)
		if err != nil {
			panic(err)
		}
		for _, e := range dirAry {
			if e.IsDir() {
				wait.Add(1)
				go scanDir(filepath.Join(dir, e.Name()))
			} else {
				atomic.AddInt64(&total, e.Size())
			}
		}
	}
	wait.Add(1)
	go scanDir(dir)
	wait.Wait()
	return
}

//
//func GetDirUseNew(dir string) (total int64) {
//	var wait sync.WaitGroup
//	var scanDir func(dir string)
//	ctx, cancel := context.WithCancel(context.Background())
//	go func() {
//		t := time.NewTicker(time.Millisecond * 100)
//		defer t.Stop()
//		for {
//			select {
//			case <-ctx.Done():
//				return
//			case <-t.C:
//				fmt.Println(runtime.NumGoroutine())
//			}
//		}
//	}()
//	dirChan := make(chan int64, 1000)
//	scanDir = func(dir string) {
//		defer wait.Done()
//		dirAry, err := ioutil.ReadDir(dir)
//		if err != nil {
//			panic(err)
//		}
//		_total := int64(0)
//		for _, e := range dirAry {
//			if e.IsDir() {
//				wait.Add(1)
//				go scanDir(filepath.Join(dir, e.Name()))
//			} else {
//				_total += e.Size()
//			}
//		}
//		dirChan <- _total
//	}
//
//	go func() {
//		wait.Add(1)
//		go scanDir(dir)
//		wait.Wait()
//		close(dirChan)
//	}()
//
//	for d := range dirChan {
//		total += d
//	}
//	cancel()
//	return
//}
